/**
  1.var声明变量；val声明常量。一般用常量
  2.多个语句需要分号，一个语句不需要分号。
  3.也支持显式声明 var v4:String = "hello world"
  4.Range区间类型。本质是一个特殊的Array
  5.集合包含类型：Array List Set Map Tuple Range Iterator等
  6.Scala没有基本类型的概念，底层会通过隐式转换机制将基本类型转换：
    Int->RichInt
    RichFloat
    RichDouble
    RichChar
    RichByte
    RichBoolean
    ...
           即调用的to方法实际上来自Rich类型
   7.Scala语句中都是对象和方法，从这个角度讲它的面向对象比JAVA更加彻底
   8.Scala 如果只有一个参数，那么可以省略.()
               比如 i.to(5) 可以写成 i to 5
   9.通用规则：会将方法体{}的最后一行代码当成返回值
               打印函数的返回值类型是Unit()
   10 any相当于java中的Object
   11.数组取值为()，而java为[]
   12.懒机制，用到时才赋值。使用lazy修饰常量(val),不能修饰变量（var）

 13.数据类型
  （1）8种注解类型和java一样
    Byte	8位有符号值，范围从-128至127
    Short	16位有符号值，范围从-32768至32767
    Int	32位有符号值，范围从-2147483648至2147483647
      注意：不是Integer
    Long	64位有符号值，范围从-9223372036854775808至9223372036854775807
    Float	32位IEEE 754单精度浮点值
    Double	64位IEEE 754双精度浮点值
    Char	16位无符号Unicode字符。范围从U+0000到U+FFFF
    String	一个Char类型序列
    Boolean	文字值true或文字值false
  （2）
    Any      所有类型**的父类，,它有两个子类AnyRef与AnyVal
    AnyVal   所有数值类型**的父类
    AnyRef   所有对象类型（引用类型）的父类
    Unit     表示空，Unit是AnyVal的子类，它只有一个的实例（），它类似于Java中的void，但scala要比Java更加面向对象
    Null     Null是AnyRef的子类，也就是说它是所有引用类型的子类。它的实例是null,   可以将null赋值给任何对象类型
    Nothing  所有类型的**子类**不能直接创建该类型实例，某个方法抛出异常时，返回的就是Nothing类型，因为Nothing是所有类的子类，那么它可以赋值为任何类型


**/

  //-------------常量和变量----------
  //--变量
  var v2 = "hello wold"
  lazy val v1 = 200
	println(v1)
	
  var v3 = 100
  println(v2)
  println(v3)
  v3 = 2323
  println(v3)
  var v4:String = "hello world"
  println(v4)
  var v5 = Array(1,2,3,4)
  var v6:Array[Int] = Array(1,2,3,4)


//--------------正则表达式：---------------------

  val s1 = "Hello world"
  val s2 = "23435345345sdf sdfd第三方"
  val s3 = "5555555[用户：456456]-精友发[用户：333334]送报文=======<ModelDetRequest>";
var s4 = "07:13:39 [http-nio-9011-exec-3] WARN  i.s.base.EdiInterfaceServlet:61 - req={";
s4 = "WARN  i.s.base.EdiInterfaceServlet:61 ";
var reg22 = ".*i\\.s\\.base\\.EdiInterfaceServlet:61.*";

s4.matches(reg22)

val reg = "\\[用户：\\d*\\]";
val reg_str = ".*"+reg+".*"
s1.matches(reg_str)
s2.matches(reg_str)
s3.matches(reg_str)
//.r()方法：Scala中将字符串转换为正则表达式
val pattern = reg.r()
//找到第一个匹配的项，返回是一个Some对象
val option_result = pattern findFirstIn s3
    option_result.getOrElse("")
(pattern findAllIn s3).mkString(",")
//把第一个匹配的项成java
pattern replaceFirstIn(s3, "Java")
//把全部匹配的项成java
pattern replaceAllIn(s3, "Java")
//---------------字符串操作--------
  var r1 = s1.split("o")
  //取出前N个元素
  val r2 = s1.take(5)
  //取出后N个元素
  val r3 = s1.takeRight(5)
  //删除前N个元素，并返回剩余元素
  val r4 = s1.drop(5)
  //删除后N个元素，并返回剩余的元素
  val r5 = s1.dropRight(5)
  //去重
  val r6 = s1.distinct
  //重复N次数
  val r7 = s1*4
  //是否包含
  val r8 = s1.contains('o')
  //按照指定的匿名函数来计数
  val r9 = s1.count(x=> x =='o')
  //按照指定的匿名函数来计数
  val r10 = s1.exists(x=> x =='w')
  //按照指定的匿名函数来过滤
  val r11 = s1.filter(x=> x =='w')

  //头
  val r12 = s1.head
  val r13 = s1.tail
  val r14 = s1.last
   //-----------------数值操作--------------
  val i = 1
  //生存区间
  val i1 = i.to(5)
  //只有一个参数时，可以这么写
  val i2 = i to 5
  //指定步长
  val i3 = i.to(5,2)
  //指定步长另外一种写法
  val i4 = i to 5 by 2
  //生成区间，但是不含尾元素
  val i5 = i.until(5)
  //生成区间，但是不含尾元素
  val i6 = i.until(5,2)
  //常规执行
  val i7 = 1 +2 * 3
  //按照顺序执行
  val i8 = (1). + (2).*(3)
  //-----------------操作符--------------
  //正数2
  val a1 = +2
  val a11 = 2.unary_+
  val a2 = -2
  val a12 = 2.unary_-
  //！布尔取反
  val a3 = !true
  val a32 = true.unary_!
  //进制取反
  val a4 = ~0xff
  val a42 = 0xff.unary_~
  
  //-----------------if else while for--------------
  val b1 = if(i >5){
     println("大于5");
     "123"
  }else{
     println("小于或等于5");
     "456"
  }

  var index= 0
  var array = Array(1,2,3,4)
  while(index < array.length){
    println(array(index))
    index = index +1
  }

  
  //<- 为固定值
  for(a <- array){
    println(a)
  }
  for(i <- array){
    println(i)
  }
  //1到5遍历
  for(i <- 1 to 5){
    println(i)
  }
  //5到1遍历
  for(i <- 1 to 5 reverse){
    println(i)
  }
  //5到1遍历
  for(i <- 5 to 1 by -1){
    println(i)
  }
   //1到5的遍历，当i>3时打印
  for(i <- 1 to 5; if i > 3){
    println(i)
  }
  //这里只能使用常量val
  for(i <- 1 to 9; j <- 1 to i ;val seq = if(i==j)"\r\n" else "\t"){
      print(i+"*"+j+" = " + i*j +seq)
  }
